iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~

在本系列文會展開使用 Avalonia UI 技術所建立的 TopAOAIConnector App 。由於使用 Avalonia UI 可以很快速的進行各平台的 桌面 應用程式開發,並且透過此 TopAOAIConnector App 來串接 Azure OpenAI Service 時所需的功能研究。

本篇是 就是要來點 A.I. 的 TopAOAIConnector App 系列文的 EP29。


EP 28 的調整中,如果只做單一一次的檔案上傳時,沒什麼太大問題,但如果一直換文字檔案上傳處理時,就發生狀況了🫨🫨🫨

而且因為處理上是直接把所有的內容重新顯示到畫面上,感覺顯示新內容時會閃一下畫面。

本回就再來改進處理吧!

P.S. 達到相同目的的做法有很多種,這邊選擇可以改動最少的方式。


首先,找到 ViewModels/ChatPageViewModel.cs 的 ChatPageViewModel 類別,幫其設計增加一個欄位。

private string appandText = string.Empty;

完成如下圖紅框:
01-1

再次找到 ChatPageViewModel 類別當中的 Attach 方法,在前一回撰寫讀取文字檔後設定上述兩欄位的資料的部分與之後的 if 判斷順序與內容稍作改變,原本為:

fileName = resultFiles[0].Name;
fileContent = await reader.ReadToEndAsync();

if (!string.IsNullOrEmpty(fileContent) && messages.Count > 1)
{
    ChatText = $"{Environment.NewLine}{ChatText}{Environment.NewLine}=======Another Attach TextFile======={Environment.NewLine}";
    
    messages.Clear();
    messages.Add(ChatMessage.CreateSystemMessage(SelectedSystemRole!.Prompt));
}

替換為:

fileContent = await reader.ReadToEndAsync();

if (!string.IsNullOrEmpty(fileContent) && messages.Count > 1)
{
    appandText = $"{Environment.NewLine}======= Another Attach TextFile =======";
    
    ChatText = $"{ChatText}{appandText}";

    messages.Clear();
    messages.Add(ChatMessage.CreateSystemMessage(SelectedSystemRole!.Prompt));
}

fileName = resultFiles[0].Name;

完成如下圖紅框:
01-2

繼續找到 ChatPageViewModel 類別當中的 BuildInline 方法,在前一回的 if 判斷內容稍作改變,原本為:

selectableTextBlock.Text = string.Empty;
selectableTextBlock.Inlines?.Clear();

int index = ChatText.IndexOf(fileContent);

selectableTextBlock.Inlines?.Add(new Run(ChatText[..index]));

var fileStackPanel = new StackPanel()
{
    Children =
    {
        new SymbolIcon() { FontSize = 60, Symbol = FluentIcons.Common.Symbol.Document, HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Left},
        new TextBlock() { FontSize = 20, Text = fileName }
    }
};

selectableTextBlock.Inlines?.Add(fileStackPanel);
selectableTextBlock.Inlines?.Add(new Run(ChatText[(index + fileContent.Length)..]));

替換為:

if (!string.IsNullOrEmpty(fileName))
{
    appandText = appandText.Replace(fileContent, string.Empty);

    selectableTextBlock.Inlines?.Add(new Run(appandText));

    var fileStackPanel = new StackPanel()
    {
        Children =
        {
            new SymbolIcon() { FontSize = 60, Symbol = FluentIcons.Common.Symbol.Document, HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Left},
            new TextBlock() { FontSize = 20, Text = fileName }
        }
    };

    selectableTextBlock.Inlines?.Add(fileStackPanel);
    fileName = string.Empty;
}
else
{
    selectableTextBlock.Inlines?.Add(new Run(appandText));
}

selectableTextBlock.Inlines?.Add(new LineBreak());
appandText = string.Empty;

完成如下圖紅框:
01-3

繼續找到 ChatPageViewModel 類別當中的 BuildChatText 方法內容稍作改變,原本為:

ChatText = $"{ChatText}{Environment.NewLine}You:{Environment.NewLine}{textContent}{Environment.NewLine}";

替換為:

appandText = $"{Environment.NewLine}You:{Environment.NewLine}{textContent}";
ChatText = $"{ChatText}{appandText}";    

而 BuildAoaiResultToChatText 方法內容稍作改變,原本為:

var textResult = $"{chatCompletion.Role}:{Environment.NewLine}{chatCompletion.Content[0].Text}";
ChatText = $"{ChatText}{Environment.NewLine}{textResult}{Environment.NewLine}";

替換為:

appandText = $"{Environment.NewLine}{chatCompletion.Role}:{Environment.NewLine}{chatCompletion.Content[0].Text}";
ChatText = $"{ChatText}{Environment.NewLine}{appandText}{Environment.NewLine}";

完成如下圖紅框:
01-4

接著來偵錯執行(F5)與測試看看吧!

輸入 "總結下列新聞為 40 字。" 的問題,並附加第一則新聞內容檔案:
02-1

等待回應與顯示結果:
02-2

輸入 "其中提到的人物名稱有?" 的問題,直接點選 "Send":
02-3

等待回應與顯示結果:
02-4

輸入 "總結下列新聞為 40 字。" 的問題,並附加第二則新聞內容檔案:
03-1

等待回應與顯示結果:
03-2

輸入 "其中提到的人物名稱有?" 的問題,直接點選 "Send":
03-3

等待回應與顯示結果:
03-4

輸入 "總結下列新聞為 40 字。" 的問題,並附加第三則新聞內容檔案:
04-1

等待回應與顯示結果:
04-2

輸入 "其中提到的人物名稱有?" 的問題,直接點選 "Send":
04-3

等待回應與顯示結果:
04-4

完成!!!


上一篇
EP 28
下一篇
EP 30
系列文
就是要來點 A.I. 的 TopAOAIConnector App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言